package com.reservation.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reservation.common.Result;
import com.reservation.entity.Message;
import com.reservation.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 留言控制器
 */
@RestController
@RequestMapping("/message")
public class MessageController {

    @Autowired
    private MessageService messageService;

    /**
     * 添加留言
     *
     * @param message 留言信息
     * @return 添加结果
     */
    @PostMapping
    public Result<Message> addMessage(@RequestBody @Valid Message message) {
        Message addedMessage = messageService.addMessage(message);
        return Result.success(addedMessage, "留言成功");
    }

    /**
     * 回复留言（仅管理员可用）
     *
     * @param id       留言ID
     * @param replyMap 回复内容
     * @return 回复结果
     */
    @PutMapping("/reply/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Message> replyMessage(
            @PathVariable Long id,
            @RequestBody Map<String, String> replyMap) {
        String reply = replyMap.get("reply");
        Message message = messageService.replyMessage(id, reply);
        return Result.success(message, "回复成功");
    }

    /**
     * 获取留言详情
     *
     * @param id 留言ID
     * @return 留言信息
     */
    @GetMapping("/{id}")
    public Result<Message> getMessageById(@PathVariable Long id) {
        Message message = messageService.getMessageById(id);
        return Result.success(message);
    }

    /**
     * 删除留言（仅管理员可用）
     *
     * @param id 留言ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Void> deleteMessage(@PathVariable Long id) {
        boolean result = messageService.deleteMessage(id);
        return Result.success(null, "删除成功");
    }

    /**
     * 分页查询留言列表
     *
     * @param pageNum  当前页
     * @param pageSize     每页大小
     * @param userId   用户ID（可选）
     * @param content  留言内容（可选）
     * @param hasReply 是否已回复（可选）
     * @return 留言列表
     */
    @GetMapping("/list")
    public Result<IPage<Message>> getMessageList(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestParam(required = false) Long userId,
            @RequestParam(required = false) String content,
            @RequestParam(required = false) Boolean hasReply) {
        Page<Message> page = new Page<>(pageNum, pageSize);
        IPage<Message> messagePage = messageService.getMessageList(page, userId, content, hasReply);
        return Result.success(messagePage);
    }

    /**
     * 获取用户的所有留言
     *
     * @param userId 用户ID
     * @return 留言列表
     */
    @GetMapping("/user/{userId}")
    public Result<List<Message>> getUserMessages(@PathVariable Long userId) {
        List<Message> messages = messageService.getUserMessages(userId);
        return Result.success(messages);
    }

    /**
     * 获取最新的留言
     *
     * @param limit 限制数量
     * @return 留言列表
     */
    @GetMapping("/latest")
    public Result<List<Message>> getLatestMessages(
            @RequestParam(defaultValue = "5") Integer limit) {
        List<Message> messages = messageService.getLatestMessages(limit);
        return Result.success(messages);
    }
}